/*
 * @Description: 数据库通用基础操作
 * @Author: pinus
 * @Email: pinus0716@163.com
 * @Git: https://gitee.com/xyf97
 * @Date: 2021-10-07 11:53:44
 * @LastEditTime: 2021-10-09 21:50:31
 */
const { result } = require('lodash')
const path = require('path')
const logger = require('../modules/logger').logger()
// 获取数据库模型
const databaseModule = require(path.join(process.cwd(), 'modules/database'))
const _ = require('lodash')

/**
 * @description: 增
 * @param {*} modelName - 目标模型
 * @param {*} obj       - 要添加的对象
 * @param {Function} cb        - 回调函数
 * @return {*}
 */
module.exports.create = function (modelName, obj, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models[modelName]
  if (!Model) return cb('模型不存在', null)

  Model.create(obj)
    .then(newObj => {
      return cb(null, newObj)
    })
    .catch(err => cb('添加失败-' + err, null))
}

/**
 * @description: 查
 * @param {*} modelName  - 模型名
 * @param {*} conditions - 查询条件
 *  conditions
	{
		"columns" : {
			字段条件
			"字段名" : "条件值"
		},
		"offset" : "偏移",
		"omit" : ["字段"],
		"only" : ["需要字段"],
		"limit" : "",
		"order" :[ 
			"字段" , A | Z,
			...
		]
	}
 * @param {Function} cb - 回调函数
 * @return {*}
 */
module.exports.list = async function (modelName, conditions, cb) {
  const db = databaseModule.getDataBase()
  let model = db.models[modelName]
  if (!model) return cb('模型不存在', null)

  //sp_permission_api as api LEFT JOIN sp_permission as main ON main.ps_id = api.ps_id WHERE main.ps_id is not null'

  // console.log(conditions)

  if (!conditions) {
    const result = await model.findAll().catch(err => cb(err, null))
    // console.log(result)
    return cb(null, result)
  } else {
    let options = {}

    if (conditions['columns']) {
      console.error('不支持 columns')
    }
    if (conditions['only']) {
      // 只需要指定的对象
      // console.error('不支持 only')
      options['attributes'] = conditions['only']
    }
    if (conditions['omit']) {
      // 忽略某项
      console.error('不支持 omit')
    }

    const result = await model.findAll(options)

    return cb(null, result)
  }
}

/**
 * @description: 返回符合条件的一项
 * @param {*} modelName  - 模型名
 * @param {*} conditions - 查询条件
 * @param {Function} cb  - 回调函数
 * @return {*}
 */

module.exports.findOne = function (modelName, conditions, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models[modelName]

  if (!Model) return cb('模型不存在', null)
  if (!conditions) return cb('条件为空', null)

  // console.log(conditions)
  Model.findOne(conditions)
    .then(result => {
      // console.log('findOne ' + result)
      return cb(null, result)
    })
    .catch(err => cb('查询失败', null))
}

/**
 * @description: 改
 * @param {*} modelName - 模型名
 * @param {*} conditions - 条件
 * @param {*} updateObj
 * @param {*} cb
 * @return {*}
 */
module.exports.update = function (modelName, conditions, updateObj, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models[modelName]

  Model.update(updateObj, conditions).catch(err => cb('更新失败-' + err, null))

  Model.findOne(conditions).then(newObj => cb(null, newObj))
}

/**
 * @description: 通过主键ID获取对象
 * @param {*} modelName - 模型名
 * @param {*} id        - 主键ID
 * @param {Function} cb - 回调函数
 * @return {*}
 */
module.exports.show = function (modelName, id, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models[modelName]

  Model.findByPk(id)
    .then(result => {
      cb(null, result)
    })
    .catch(err => cb(err, null))

  // Model.get(id, function (err, obj) {
  //   cb(err, obj)
  // })
}

/**
 * @description: 删
 * @param {*} modelName - 模型名
 * @param {*} id        - 主键ID
 * @param {Function} cb - 回调函数
 * @return {*}
 */
module.exports.destroy = function (modelName, conditions, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models[modelName]

  Model.destroy(conditions)
    .then(() => cb(null))
    .catch(err => cb(err))
}

/**
 * @description: 通过条件判断数据是否存在
 * @param {*} modelName  - 模型名
 * @param {*} conditions - 条件
 * @param {Function} cb  - 回调函数
 * @return {*}
 */
// module.exports.exists = function (modelName, conditions, cb) {
//   const db = databaseModule.getDataBase()
//   const Model = db.models[modelName]
//   Model.exists(conditions, function (err, isExists) {
//     if (err) return cb('查询失败')
//     cb(null, isExists)
//   })
// }

/**
 * @description: 获取模型
 * @param {*} modelName - 模型名
 * @return {*}
 */
module.exports.getModel = function (modelName) {
  const db = databaseModule.getDataBase()
  return db.models[modelName]
}

/**
 * @description: 通过模型名称获取数据库数量
 * @param {*} modelName
 * @param {*} cb
 * @return {*}
 */
module.exports.count = function (modelName, cb) {
  const db = databaseModule.getDataBase()
  const Model = db.models[modelName]
  Model.count(cb)
}

/**
 * @description: 有条件的通过模型名称获取数据库数量
 * @param {*} modelName
 * @param {*} cb
 * @return {*}
 */
module.exports.countByConditions = function (modelName, conditions, cb) {
  const db = databaseModule.getDataBase()
  var model = db.models[modelName]
  if (!model) return cb('模型不存在', null)

  model
    .findAndCountAll(conditions)
    .then(result => {
      return cb(null, result.count)
    })
    .catch(err => cb(err, null))
}
